<script>
    /* 
        6.2 对象的创建
            字面字面量     new
        工厂模式
        构造函数模式
    this的指向分类：
        1.函数的调用          this指向window 全局作用域
        2.对象的方法和属性调用  this指向对象
        3.构造函数调用         this指向创建的新对象
        4.强制指向一个对象     apply call   第一个是指向的对象

    new的步骤:
        1.创建一个新对象
        2.构造函数的作用域赋给新对象、
        3.执行构造函数中的代码
        4.返回新对象
    第一个字母大写，这是一个构造函数


    获取对象的自有属性
        hasOwnProperty
        Object.getOwnProperty
    获取对象的所有属性
        for...in
        Object.keys()返回一个数组
    获取对象的原型属性
        做差
        getOwnPropertyName

    哪些可枚举，默认可枚举   每一个对象默认的方法不可枚举
        
    in操作符可以判断对象的属性是否存在
原型模式的步骤
    1.创建构造函数
    2.原型添加属性
    3.new 
    4.调用方法

    */
//    工厂函数  多个相似对象   没有解决对象是一个什么类型  构造函数是object
// function createPerson(name,age,job){
//     var o= new Object();
//     o.name = name;
//     o.age = age;
//     o.job = job ;
//     o.sayName= function(){
//         console.log(this.name);
//     }
//     return o;
// }
// 构造函数模式   不共享
// 如何解决：constructor  一个对象有一个构造函数 
// 问题  每一个sayName都是不相同的对象
// function Person(name,age,job){
//     this.name = name;
//     this.age = age;
//     this.job = job;
//     this.sayName = function(){
//         console.log(this.name);
//     }
// }
// 原型模式   共享资源
// 解决构造函数在全局作用域中定义一个函数，定义多个方法会定义多个全局函数
function Person(){

}
// Person.prototype.name = 'xiaoming';
// Person.prototype.age = 20;
// Person.prototype.job = 'job';
// Person.prototype.sayName = function(){
//         console.log(this.name);
//     }


// 组合使用构造函数模式和原型模式




// 简写 constructor 指向          
Person.prototype={
    name:"",
    age:"",
}
    console.log(Person.prototype);
    console.log(new Person().sayName==new Person().sayName);
    console.log(Object.prototype);
</script>